package com.lemon.tankgame3;


import java.util.Vector;

/**
 * @author 软柠柠吖
 * @date 2022/1/19
 */
public class Enemy extends Tank implements Runnable {
    //    Vector<Shot> shots = new Vector<>(100);
    static Vector<Enemy> enemies = new Vector<>();
    // 这里count 和 speed 并非等价，因为一直在不断的重绘
    // for循环 中每调用一次移动的方法，坦克就移动一次
    // 而 修改speed 是直接修改 移动方法，会出现坦克瞬移的现象
    int count = 30;

    public Enemy(int x, int y, int direct, int type, Wall wall) {
        super(x, y, direct, type, wall);

        // 启动敌方坦克线程
        new Thread(this).start();
    }

    // 判断坦克之间是否重叠或者碰撞
    public boolean isTouchTank() {
        // 判断当前坦克(this) 方向
        switch (getDirect()) {
            case 0:// 向上
//                // 让当前敌人坦克 和其他所有的敌人坦克比较
//                for (int i = 0; i < enemies.size(); i++) {
//                    // 从Vector 中取出一个坦克
//                    Enemy enemy = enemies.get(i);
//                    // 不和自己比较
//                    if (enemy != this) {
//                        // 如果敌人坦克是 上下方向
//                        // 碰撞范围 横坐标：[x-40, x+40] 纵坐标：[y-60, y+60]
//                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
//                            if (this.getX() >= enemy.getX() - 40 && this.getX() <= enemy.getX() + 40
//                                    && this.getY() >= enemy.getY() - 60 && this.getY() <= enemy.getY() + 60) {
//                                return true;
//                            }
//                        }
//                        // 如果敌人坦克是 右左方向
//                        // 碰撞范围 横坐标：[x-50, x+50] 纵坐标：[y-50, y+50]
//                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
//                            if (this.getX() >= enemy.getX() - 50 && this.getX() <= enemy.getX() + 50
//                                    && this.getY() >= enemy.getY() - 50 && this.getY() <= enemy.getY() + 50) {
//                                return true;
//                            }
//                        }
//                    }
//                }
//                break;
            case 2:// 下
                // 让当前敌人坦克 和其他所有的敌人坦克比较
                for (int i = 0; i < enemies.size(); i++) {
                    // 从Vector 中取出一个坦克
                    Enemy enemy = enemies.get(i);
                    // 不和自己比较
                    if (enemy != this) {
                        // 如果敌人坦克是 上下方向
                        // 碰撞范围 横坐标：[x-40, x+40] 纵坐标：[y-60, y+60]
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            if (this.getX() >= enemy.getX() - 40 && this.getX() <= enemy.getX() + 40
                                    && this.getY() >= enemy.getY() - 60 && this.getY() <= enemy.getY() + 60) {
                                return true;
                            }
                        }
                        // 如果敌人坦克是 右左方向
                        // 碰撞范围 横坐标：[x-50, x+50] 纵坐标：[y-50, y+50]
                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
                            if (this.getX() >= enemy.getX() - 50 && this.getX() <= enemy.getX() + 50
                                    && this.getY() >= enemy.getY() - 50 && this.getY() <= enemy.getY() + 50) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1:// 右
//                // 让当前敌人坦克 和其他所有的敌人坦克比较
//                for (int i = 0; i < enemies.size(); i++) {
//                    // 从Vector 中取出一个坦克
//                    Enemy enemy = enemies.get(i);
//                    // 不和自己比较
//                    if (enemy != this) {
//                        // 如果敌人坦克是 上下方向
//                        // 碰撞范围 横坐标：[x-50, x+50] 纵坐标：[y-50, y+50]
//                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
//                            if (this.getX() >= enemy.getX() - 50 && this.getX() <= enemy.getX() + 50
//                                    && this.getY() >= enemy.getY() - 50 && this.getY() <= enemy.getY() + 50) {
//                                return true;
//                            }
//                        }
//                        // 如果敌人坦克是 右左方向
//                        // 碰撞范围 横坐标：[x-60, x+60] 纵坐标：[y-40, y+40]
//                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
//                            if (this.getX() >= enemy.getX() - 60 && this.getX() <= enemy.getX() + 60
//                                    && this.getY() >= enemy.getY() - 40 && this.getY() <= enemy.getY() + 40) {
//                                return true;
//                            }
//                        }
//                    }
//                }
//                break;

            case 3:// 左
                // 让当前敌人坦克 和其他所有的敌人坦克比较
                for (int i = 0; i < enemies.size(); i++) {
                    // 从Vector 中取出一个坦克
                    Enemy enemy = enemies.get(i);
                    // 不和自己比较
                    if (enemy != this) {
                        // 如果敌人坦克是 上下方向
                        // 碰撞范围 横坐标：[x-50, x+50] 纵坐标：[y-50, y+50]
                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
                            if (this.getX() >= enemy.getX() - 50 && this.getX() <= enemy.getX() + 50
                                    && this.getY() >= enemy.getY() - 50 && this.getY() <= enemy.getY() + 50) {
                                return true;
                            }
                        }
                        // 如果敌人坦克是 右左方向
                        // 碰撞范围 横坐标：[x-60, x+60] 纵坐标：[y-40, y+40]
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            if (this.getX() >= enemy.getX() - 60 && this.getX() <= enemy.getX() + 60
                                    && this.getY() >= enemy.getY() - 40 && this.getY() <= enemy.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            default:
                break;
        }
        return false;
    }


    public static void setEnemies(Vector<Enemy> enemies) {
        Enemy.enemies = enemies;
    }

    // 射击
//    public void shotHeroTank(int x, int y, int direct, int type) {
//        // System.out.println("type=" + type);
//        Shot shot = new Shot(x, y, direct, type);
//        shots.add(shot);
//        new Thread(shot).start();
//    }

    @Override
    public void run() {
        int n = 0;
        while (true) {
            // 写并发程序，一定要考虑清楚，该线程什么时候结束
            if (!isLive()) {
                break;
            }
            // 随机改变坦克方向
            n = (int) (Math.random() * 100 + 1);
            if (n > 75) {
                setDirect(0);
                for (int i = 0; i < count; i++) {
                    if (getY() - 30 > 0 && !isTouchTank()) {
                        moveUp();
                    }
                    tankSleep();
                }
            } else if (n > 50) {
                setDirect(1);
                for (int i = 0; i < count; i++) {
                    if (getX() + 20 < wall.x && !isTouchTank()) {
                        moveRight();
                    }
                    tankSleep();
                }
            } else if (n > 25) {
                setDirect(2);
                for (int i = 0; i < count; i++) {
                    if (getY() + 30 < wall.y && !isTouchTank()) {
                        moveDown();
                    }
                    tankSleep();
                }
            } else {
                setDirect(3);
                for (int i = 0; i < count; i++) {
                    if (getX() - 20 > 0 && !isTouchTank()) {
                        moveLeft();
                    }
                    tankSleep();
                }
            }
            if (shots.size() < 1) {
                shotTank();
            }

        } // while
    }

    // 坦克休眠50毫秒
    public void tankSleep() {
        // 休眠50毫秒
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
